// 路由
import router from '@admin/router';

// 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// axios
import axios from 'axios'

// 消息提示框
import { ElMessage } from 'element-plus';

// 用户信息工具类
import UserStorage from '@admin/utils/userStorage';

// 防抖：将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时， loading闪烁的问题。
// const toHideLoading = _.debounce(() => {
//   loading && loading.clear()
//   loading = null
// }, 300)

// axios实例
const http = axios.create({
  timeout: 60000, // 设置请求超时时间，单位：ms
  baseURL: 'http://123.56.122.168:8080/api/v1' // url的前缀
})

// 请求拦截器：添加token、显示进度条
http.interceptors.request.use(config => {
  NProgress.start()
  let token = localStorage.getItem("admin-token")
  if (token) {
    config.headers["admin-token"] = token;
  }
  return config
})

//响应拦截器1：统一处理http响应码
http.interceptors.response.use(
  response => {
    return response
  },
  error => {
    // 获取http状态码
    const status = (error.response && error.response.status) || ''
    console.log("响应状态码："+status)

    // 获取响应体
    let data = (error.response && error.response.data)

    // 代理服务器如果连接不了后台服务器，则响应有状态码，但是响应体不是指定的格式
    if (typeof data === 'string') {
      data = { code: 0, message: data }
    }
    switch (status) {
      case 405:
          ElMessage({
            message: "验证码错误",
            type: 'warning',
          });    
        router.push('/login')
        break
      case 460:
          ElMessage({
            message: "异地已登录，请重新登录",
            type: 'warning',
          });    
        console.log("清除token")
        localStorage.removeItem("access-token")
        router.push('/login')
        break
      case 401:
        if (data.msg) {
          ElMessage({
            message: data.msg,
            type: 'warning',
          });
        }
        UserStorage.clear()
        router.push('/login')
        break
      case 500:
        ElMessage({
          message: data.msg || '服务器内部错误',
          type: 'warning',
        });
        break
      default:
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
          data.message = '请求超时~~~'
        } else if (error.code === 'ERR_NETWORK') {
          data.message = '网络未连接或者服务器未启动~~~'
        }
        ElMessage({
          showClose: true,
          message: data.message,
          type: 'warning',
        });
    }
    return Promise.reject(data)
  }
)

// 响应拦截器2：隐藏进度条
http.interceptors.response.use(
  response => {
    NProgress.done()
    return response
  },
  error => {
    NProgress.done()
    return Promise.reject(error)
  }
)

export default http
